package com.itheima.tlias84.controller;

import ch.qos.logback.classic.spi.EventArgUtil;
import com.itheima.tlias84.Util.ResultUtil;
import com.itheima.tlias84.entity.Student;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * DI:从ioc容器中获取已经创建好的对象给属性(成员变量)赋值
 * 给一个类的属性(成员变量)赋值 有四种方式:
 * 1.直接等号赋值
 * 2.构造器赋值
 * 3.set方法
 * 4.反射
 * @Autowired 一般使用在构造器赋值和set方法赋值时
 * 所以说spring DI注入有三种方式
 * 字段(属性)DI ->@Resource
 * 构造器DI   ->@Autowired
 * set方法DI  ->@Autowired
 *
 * @Resource 与 @Autowired区别:
 * 如果一个SpringBean类中值需要注入很少的其他的Bean对象->优先使用@Resource
 * 如果一个SpringBean类中值需要注入很多的其他的Bean对象->优先使用@Autowired  ->可以基于lombok实现构造器注入(注入的必须是bean对象)
 * 在Controller层也可以加上@AllArgsConstructor 生成
 *
 *springboot注入时候要注意的问题:
 * 1.非Bean不能调用Bean
 * 2.Bean不能形成循环依赖->如何解决
 */
@Slf4j
@RestController
@RequestMapping("context")
public class TestApplicationContextController {
//    @Resource
//    ApplicationContext context;

//    @Resource(name = "zhangsan")
//    Student student;
//
//    @Autowired
//    com.itheima.tlias84.entity.Student lisi;

//    @GetMapping("bean")
//    public ResultUtil getBean(){
//        log.info("学生Bean{}", student);
//        Object zhangsan = context.getBean("zhangsan");
//        log.info("lisi={}",lisi);
//        com.itheima.tlias84.entity.Student bean=  context.getBean(com.itheima.tlias84.entity.Student.class);
//        log.info("lisi={}",bean);
//        return ResultUtil.success();
//    }


}
